<?php



use Illuminate\Support\Facades\DB;

/* 提取IC 池中第一个未使用的IC
 * 返回 integer
 *      
 */
function getfirstic() {
    $ic = DB::table('icpools')
            ->where('isused', 0)
            ->orderBy('id', 'asc')
            ->first();

    /* 没有记录了就插入一条，然后填充100条记录进池 */
    if (FALSE == $ic) {
        $rs['isused'] = 0;
        $rs['created_at'] = date('Y-m-d H:i:s', time());
        $rs['updated_at'] = date('Y-m-d H:i:s', time());

        $id = DB::table('icpools')->insertGetId($rs);

        /* 插入100条记录 */
        $sql = array();
        $time = date('Y-m-d H:i:s', time());

        for ($i = 0; $i < 100; $i++) {
            $sql[] = array('isused' => 0, 'created_at' => $time . '', 'updated_at' => $time . '');
        }

        DB::table('icpools')->insert($sql);


        $id;
    } else {
        $id = $ic->id;
    }

    /* 更新为已使用并返回id */
    $time = DB::table('icpools')
            ->where('id', $id)
            ->update(['isused' => 1, 'updated_at' => date('Y-m-d H:i:s', time())]);

    return $id;
}

/* 生成随机码
 * $codetype: 什么码 垛码还是什么
 *            stack = 垛码
 *  */

function makecode($codetype) {
    $ver = '1'; //版本

    $mycode = '';

    /* 类型 */
    switch ($codetype) {
        /* 生成共16位的垛码 */
        case 'stack':
            $mytype = '001';  //垛码   

            $randstr = $this->generate_randchar(10, 'num'); //10位随机数

            $codehash = $this->getcodehashnum($randstr); //2位校验,从第五位开始

            $mycode = $ver . $mytype . $randstr . $codehash;

            break;
        default:
            break;
    }

    return $mycode;
}

function generate_randchar($length = 10, $type = '') {//生成随机函数
    // 密码字符集，可任意添加你需要的字符
    $chars = 'abcdefghijkmnopqrstuvwxyz0123456789';
    if ($type == 'num')
        $chars = '0123456789';
    if ($type == 'char')
        $chars = 'abcdefghijkmnopqrstuvwxyz';
    $mychar = '';
    for ($i = 0; $i < $length; $i++) {
        $mychar .= $chars[mt_rand(0, strlen($chars) - 1)];
    }
    return $mychar;
}

/* 生成校验位
 * 把字符串Md5加密， 再取出数字， 最后取数字后两位                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
 *      */

function getcodehashnum($str) {
    $j = ''; //准备返回的字符串

    $salt = 'zh2016715qazyhn6Tsla3kxk83xs2saaa3sx26xbHrMesCmVBQf2WvaJEPaerDvUt2YiNK68y';

    $md5code = hash_hmac('md5', $str, $salt);

    for ($i = 0; $i < strlen($md5code) + 1; $i++) {
        $v = substr($md5code, (strlen($md5code) - $i), 1);

        if (is_numeric($v)) {
            $j .= $v;
        }


        if (1 == strlen($j)) {
            return $j;
        }
    }
}
